En los años de la pandemia, en los Estados Unidos de América, el comportamiento del uso de tarjetas de crédito ha variado bastante. El promedio de la deuda de tarjeta de crédito creció en 52% entre el 2020 y el 2019, sin embargo, este porcentaje ha caído significativamente en el 2020 (ValuePenguin) (Household Debt and Credit Report, NewYorkFed). Este proyecto pretende utilizar conceptos y metodos de Data Science para predecir que tipo de clientes tienden a caer en impago basandose en los datos disponibles en el archivo UCI_Credit_Card.
El objetivo de este proyecto es crear modelos de aprendizaje automático que permita predecir qué tipo de clientes podrán caer en impago, o no. Para esto se cuenta con un conjunto de datos que contiene información sobre pagos predeterminados, factores demográficos, datos crediticios, historial de pagos y extractos de cuentas de clientes de tarjetas de crédito en Taiwán desde abril de 2005 hasta septiembre de 2005.
Generales:
Especificos:
Descripcion del dataset como estaba:
Hay 25 variables (22 cuantitativas, 3 categoricas):
import pandas as pd
import numpy as np
from pandas_profiling import ProfileReport
import seaborn as sn
import matplotlib.pyplot as plt
from quickda.clean_data import *
from quickda.explore_data import *
from quickda.clean_data import *
df = pd.read_csv("UCI_Credit_Card.csv")
df.head()
explore(df, method="summarize")
profile = ProfileReport(df, minimal=True)
profile
df = clean(df, method = "standardize")
df.head()
to_categoric = ["sex", "education", "marriage",
"pay_0", "pay_2","pay_3", "pay_4", "pay_5","pay_6","default.payment.next.month"]
df = clean(df, method = 'dtypes', columns = to_categoric,
dtype='category')
df = df.rename(columns = {'pay_0': 'pay_1',}, inplace = False)
explore(df, method="summarize")
df = clean(df, method = 'dropcols', columns = ['id'])
df = clean(df, method = "replaceval",
columns = ["education"],
to_replace = [0,5,6],
value = 5)
df = clean(df, method = "replaceval",
columns = ["marriage"],
to_replace = [0],
value = 3)
Estos valores si tienen un significato en el dataset con respecto a la realizacion de los pagos por lo que no se pueden modificar a nulo.
correlation = df.corr()
plt.figure(figsize = (13, 10))
sn.heatmap(correlation, annot=True)
plt.show()
dfSimp = df
promedio = (dfSimp["bill_amt1"]+dfSimp["bill_amt2"]+dfSimp["bill_amt3"]
+dfSimp["bill_amt4"]+dfSimp["bill_amt5"]+dfSimp["bill_amt6"])/6
dfSimp["prom_bill_amt"] = promedio
dfSimp = clean(dfSimp, method = 'dropcols', columns = ['bill_amt1',"bill_amt2","bill_amt3","bill_amt4","bill_amt5","bill_amt6"])
cols = ['limit_bal', 'sex','education','marriage','age','pay_1','pay_2','pay_3',
'pay_4','pay_5','pay_6','prom_bill_amt','pay_amt1','pay_amt2','pay_amt3','pay_amt4','pay_amt5',
'pay_amt6','default.payment.next.month']
dfSimp = dfSimp[cols]
correlation = dfSimp.corr()
plt.figure(figsize = (13, 10))
sn.heatmap(correlation, annot=True)
plt.show()
explore(dfSimp, method="summarize")
#Creacion de graficas para visualizar cada columna del dataset
dfSimp.hist(figsize=(30, 25))
dfSimp = clean(dfSimp, method='outliers', columns=["pay_amt1","pay_amt3","pay_amt5"])
dfSimp.index = list(range(0,23241))
explore(dfSimp, method="summarize")
Despues de eliminar algunos datos atipicos nos quedamos con 23241 observaciones que es alrededor del 77% del data set original, lo que nos parece aun una buena cantidad de elementos con los que trabajar.
#Creacion de graficas para visualizar cada columna del dataset
dfSimp.hist(figsize=(30, 25))
dfSimp['education'].value_counts().plot(kind='bar', title = "Educacion")
dfSimp['marriage'].value_counts().plot(kind='bar', title = "Estado civil")
dfSimp['sex'].value_counts().plot(kind='bar', title = "Sexo")
dfSimp['default.payment.next.month'].value_counts().plot(kind='bar', title = "Impago")
pd.crosstab(dfSimp.education, dfSimp['default.payment.next.month']).plot(kind="bar",figsize=(15,6), title = "Analisis de pago por educacion")
plt.xlabel('Educacion')
plt.xticks(rotation=0)
plt.legend(["Pago", "Impago"])
plt.show()
pd.crosstab(dfSimp.age, dfSimp['default.payment.next.month']).plot(kind="bar",figsize=(15,6), title = "Analisis de pago por edad")
plt.xlabel('Edad')
plt.xticks(rotation=0)
plt.legend(["Pago", "Impago"])
plt.show()
pd.crosstab(dfSimp.sex, dfSimp['default.payment.next.month']).plot(kind="bar",figsize=(15,6), title = "Analisis de pago por sexo")
plt.xlabel('Genero')
plt.xticks(rotation=0)
plt.legend(["Pago", "Impago"])
plt.show()
pd.crosstab(dfSimp.marriage, dfSimp['default.payment.next.month']).plot(kind="bar",figsize=(15,6),title = "Analisis de pago por estado civil")
plt.xlabel('Estado Civil')
plt.xticks(rotation=0)
plt.legend(["Pago", "Impago"])
plt.show()
sns.catplot(x="default.payment.next.month", y="limit_bal", data=dfSimp)
sns.catplot(x="education", y="limit_bal", data=dfSimp)
sns.catplot(x="default.payment.next.month", y="prom_bill_amt", data=dfSimp)
El conjunto de datos tras las operaciones de limpieza cuenta con 23241 observaciones y 19 variables. De estas variables:
Al analizar las variables cualitativas podemos notar ciertas caracteristicas imporantes como:
De las variables cuantitativos podemos observar lo siguiente:
Al cruzar variables podemos observar lo siguiete: